const http = require('http')
const path = require('path')
const fs = require('fs')
const url = require('url')
const qs = require('querystring')
const port = 3000

// 网站请求的根 映射到 服务器中的 具体的目录路径
// http /  => 服务器 f:/xx/web
const webRoot = path.resolve('./web')

// mime类型
// const mimes = {
//   jpg: 'image/jpeg',
//   html: 'text/html;charset=utf-8'
// }
const mimes = require('./mime')


const server = http.createServer()
server.on('request', (req, res) => {

  res.json = function (data) {
    res.end(JSON.stringify(data))
  }

  let { pathname, query } = url.parse(req.url, true)
  // 添加到request对象中
  req.query = query


  // 如果它为post提交，则入到另一个处理程序
  if ('post' == req.method.toLowerCase()) {
    // 文件上传，过来的是一个buffer数据流
    if ('/upfile' == pathname) { // 文件上传
      // 客户端传入过来的是一个buffer数据
      let filename = req.headers['filename']
      req.pipe(fs.createWriteStream(path.resolve('./web/upload/' + filename)))
      res.json({
        code: 0,
        msg: 'ok',
        data: { url: '/upload/' + filename }
      })
    } else if ('/login' == pathname) {
      // 接受数据
      // post提交可能会有很多的数据，nodejs会异步进行处理  data end
      let postData = ''
      // 开始接受数据
      req.on('data', chunk => {
        postData += chunk
      })
      // 数据接受完毕
      req.on('end', () => {
        let jsonData = qs.parse(postData)
        res.json(jsonData)
      })
    }
    return;
  }


  // 对于请求的地址进行默认页面处理
  pathname = pathname == '/' ? '/index.html' : pathname
  // 得到用户请求的地址
  if (pathname == '/favicon.ico') {
    res.end('')
    return;
  }

  // 用户请求的地址转换成在服务器中真实的文件路径  根据请求地址来对应响应  路由s
  let filepath = path.join(webRoot, pathname)

  // 判断请求文件在服务器中是否真的存在
  if (!fs.existsSync(filepath)) {
    // 请求的文件不存在，返回404
    res.statusCode = 404
    filepath = path.join(webRoot, '404.html')
  }

  // 获取扩展名
  let extname = path.extname(filepath)
  mime = 'text/html;charset=utf-8'
  if (extname) {
    extname = extname.slice(1)
    mime = mimes[extname]
  }
  // mime头类型
  res.setHeader('Content-Type', mime)
  // 流向客户端发送数据
  if (['html', 'htm'].includes(extname)) { // 只针对于html中的字符串完成操作
    let html = fs.readFileSync(filepath, 'utf-8')
    // html = html.replace('{{id}}', query.id)
    html = html.replace(/\{\{(\w+)\}\}/g, function (match, arg1) {
      // null合并，3目运算简写
      // return req.query[arg1] ?? '无'
      return req.query[arg1] ? req.query[arg1] : '无'
    })
    res.end(html)
  } else {
    fs.createReadStream(filepath).pipe(res)
  }
})

server.listen(3000, '0.0.0.0', () => {
  console.log('http://localhost:3000')
})


